package com.hwh.springdatajpademo.config;

import com.hwh.springdatajpademo.pojo.Pet;
import com.hwh.springdatajpademo.pojo.Role;
import com.hwh.springdatajpademo.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 1.配置类里使用@Bean标注在方法上给容器注册组件，默认是单实例
 * 2.配置类本身也是组件
 * 3.proxyBeanMethod：代理Bean的方法
 *   full：(proxyBeanMethod=true) 无论在那里调用，都会从容器中获取组件,可以实现组件依赖
 *   lite:(proxyBeanMethod=false) 容器中不会保存代理对象，每次调用都会产生新的对象.
 *   优缺点：
 *      lite模式可以跳过检查，提高运行速度。full模式需要检查，运行速度相对较慢。
 *   最佳实践：
 *      如果该配置类里没有组件依赖，那就是使用lite模式。否则使用full模式。
 */
@Configuration(proxyBeanMethods = true)
public class BeanConfig {

    @Bean
    public User user01(){
        return new User("1","hwh","21231@qq.com","");
    }

    @Bean("tom")
    public Role role01(){
        return new Role("123","Bean管理");
    }
    @Bean("zed")
    public Pet pet(){
        /**
         * 在这行代码里，zed组件依赖了user01组件，如果代理模式是true，那这行代码不会报错，反之则会报错
         *
         */
        return new Pet("zed",user01());
    }
}
